上一章我們用detector
人臉偵測器和圖片分割的方式做出了大頭照攝影程式,本章我們來玩點比較進階的動態人臉捕捉程式吧。
import dlib
import cv2
import imutils
和上一章的步驟一樣,我們先將攝像頭和人臉偵測器先設定好:
cap = cv2.VideoCapture(0)
detector = dlib.get_frontal_face_detector()
接下來和之前不一樣,因為我們需要一直開啟攝像頭來進行動態辨識,所以我們要用迴圈將程式主體包起來:
while(cap.isOpened()):
然後用cap.read
和detector.run
兩個函式進行人臉捕捉:
ret, frame = cap.read()
face_rects, scores, idx = detector.run(frame, 0)
可以看到detector.run
完之後多了兩個變數,這是這個函式本身就提供的辨識資料,其中scores
代表辨識分數,分數越高則人臉辨識的精確率越高,而idx
代表臉部方向,可能被辨識為正臉、面向左邊、面向右邊、面向上方、面向下方等。把這兩個變數取出來有助於我們對結果的理解,下面我們會對這兩個變數進行加工。
for i, d in enumerate(face_rects):
x1 = d.left()
y1 = d.top()
x2 = d.right()
y2 = d.bottom()
text = "%2.2f(%d)" % (scores[i], idx[i])
和上章有些不同的是,我們需要將辨識分數和人臉方向顯示在畫面上,所以我們把scores
和idx
的資料帶入text
變數。
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 4, cv2.LINE_AA)
cv2.putText(frame, text, (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
這裡我們用之前說過的cv2.rectangle
函式畫出矩形,將辨識到的臉部標示出來,然後用cv2.putText
在矩形上方繪出text變數的內容,這兩個東西會隨著frame
變動位置。
上面就是程式的主要部份了,迴圈尾端記得設置break
條件,不然程式會跳不出去:
cv2.imshow("FaceShow", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 迴圈結束
cap.release()
cv2.destroyAllWindows()
試著執行看看吧!